package com.wugh.fast.module.mapper;

import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.Weekend;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author 吴冠辉
 * @date 2018/2/2
 */
public interface EnhanceMapper<T> {
    /**
     * 获取Example对象
     *
     * @return
     */
    Example getExample();

    /**
     * 获取Weekend对象,其实是Example对象的二级封装
     *
     * @return
     */
    Weekend<T> getWeekend();

    /**
     * 统计全表数量
     *
     * @return
     */
    int selectCount();

    /**
     * 根据主键去统计数量
     * <pre>
     *     即统计主键存在数量
     * </pre>
     * @param value
     * @param <V>
     * @return
     */
    <V> int selectCountByPrimaryKey(V value);

    /**
     * 根据主键去统计数量
     * <pre>
     *     即统计主键存在数量
     * </pre>
     * @param values
     * @param <V>
     * @return
     */
    <V> int selectCountByPrimaryKey(Collection<V> values);

    /**
     * 根据指定属性统计数量
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    <V> int selectCountByProperty(String propertyName, V value);

    /**
     * 根据指定属性统计数量
     *
     * @param propertyName 属性名
     * @param values       属性值集合
     * @return
     */
    <V> int selectCountByProperty(String propertyName, Collection<V> values);

    /**
     * 根据指定属性查询单个结果
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    <V> T selectOneByProperty(String propertyName, V value);

    /**
     * 根据主键集合查询数据
     *
     * @param values 主键集合
     * @return
     */
    <V> List<T> selectByPrimaryKey(Collection<V> values);

    /**
     * 根据指定属性查询数据
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    <V> List<T> selectByProperty(String propertyName, V value);

    /**
     * 根据指定属性查询数据
     *
     * @param propertyName 属性名
     * @param values       属性值集合
     * @return
     */
    <V> List<T> selectByProperty(String propertyName, Collection<V> values);

    /**
     * 根据主键集合删除数据
     *
     * @param values 主键集合
     * @return
     */
    <V> int deleteByPrimaryKey(Collection<V> values);

    /**
     * 根据指定属性删除数据
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    <V> int deleteByProperty(String propertyName, V value);

    /**
     * 根据指定属性删除数据
     *
     * @param propertyName 属性名
     * @param values       属性值集合
     * @return
     */
    <V> int deleteByProperty(String propertyName, Collection<V> values);

    /**
     * 根据主键集合查询数据,并转化成Map集合
     *
     * @param values 主键集合
     * @return
     */
    <K, V> Map<K, T> mapByPrimaryKey(Collection<V> values);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    <K, V> Map<K, T> mapByProperty(String propertyName, V value);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyName    属性名
     * @param value           属性值
     * @param keyPropertyName key属性名,默认为主键
     * @return
     */
    <K, V> Map<K, T> mapByProperty(String propertyName, V value, String keyPropertyName);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyName 属性名
     * @param values       属性集合
     * @return
     */
    <K, V> Map<K, T> mapByProperty(String propertyName, Collection<V> values);

    /**
     * 根据指定属性查询数据,并转化成Map集合
     *
     * @param propertyName    属性名
     * @param values          属性集合
     * @param keyPropertyName key属性名,默认为主键
     * @return
     */
    <K, V> Map<K, T> mapByProperty(String propertyName, Collection<V> values, String keyPropertyName);

    /**
     * 根据Example查询数据,并转化成Map集合
     *
     * @param example Example搜索条件
     * @return
     */
    <K> Map<K, T> mapByExample(Object example);

    /**
     * 根据Example查询数据,并转化成Map集合
     *
     * @param example         Example搜索条件
     * @param keyPropertyName key属性名,默认为主键
     * @return
     */
    <K> Map<K, T> mapByExample(Object example, String keyPropertyName);

    /**
     * 根据主键集合查询数据,并分组转化成Map集合
     *
     * @param values          主键集合
     * @param keyPropertyName 分组的属性名
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByPrimarykey(Collection<V> values, String keyPropertyName);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByProperty(String propertyName, V value);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyName    属性名
     * @param value           属性值
     * @param keyPropertyName 分组的属性名,缺省值为查询的属性名
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByProperty(String propertyName, V value, String keyPropertyName);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyName 属性名
     * @param values       属性值集合
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByProperty(String propertyName, Collection<V> values);

    /**
     * 根据指定属性查询数据,并分组转化成Map集合
     *
     * @param propertyName    属性名
     * @param values          属性值集合
     * @param keyPropertyName 分组的属性名,缺省值为查询的属性名
     * @return
     */
    <K, V> Map<K, List<T>> groupMapByProperty(String propertyName, Collection<V> values, String keyPropertyName);

    /**
     * 根据Example查询数据,并分组转化成Map集合
     *
     * @param example         Example搜索条件
     * @param keyPropertyName 分组的属性名
     * @return
     */
    <K> Map<K, List<T>> groupMapByExample(Object example, String keyPropertyName);
}
